package pl.marekbar;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import android.widget.DatePicker;

public class Data
{
	private int dzisiajRok, dzisiajMiesiac, dzisiajDzien;
	private int ustawionyRok, ustawionyMiesiac, ustawionyDzien;
	private Calendar kalendarz = Calendar.getInstance();

	public static int ROWNA = 0;
	public static int WIEKSZA = 1;
	public static int MNIEJSZA = -1;



	public Data()
	{
		this.ustawDzisiaj();
		this.ustawDate(this.dzisiajDzien, this.dzisiajMiesiac, this.dzisiajRok);
	}



	public Data(DatePicker wybieraczka)
	{
		this.ustawDzisiaj();
		this.ustawDate(wybieraczka.getDayOfMonth(), wybieraczka.getMonth(),
				wybieraczka.getYear());
	}



	public Data(int DD, int MM, int RRRR)
	{
		this.ustawDzisiaj();
		this.ustawDate(DD, MM, RRRR);
	}



	public Data(String data)
	{
		this.ustawDzisiaj();
		String[] dane = data.split("-");
		if (dane.length == 3)
		{
			int RRRR = Integer.parseInt(dane[0]);
			int MM = Integer.parseInt(dane[1]);
			int DD = Integer.parseInt(dane[2]);
			this.ustawDate(DD, MM, RRRR);
		}
		else
		{
			this.ustawDate(this.dzisiajDzien, this.dzisiajMiesiac,
					this.dzisiajRok);
		}
	}



	private void ustawDzisiaj()
	{
		this.dzisiajRok = this.kalendarz.get(Calendar.YEAR);
		this.dzisiajMiesiac = this.kalendarz.get(Calendar.MONTH);
		this.dzisiajDzien = this.kalendarz.get(Calendar.DAY_OF_MONTH);
	}



	public void ustawDate(int DD, int MM, int RRRR)
	{
		this.ustawionyDzien = DD;
		this.ustawionyMiesiac = MM;
		this.ustawionyRok = RRRR;
	}



	/**
	 * Zwraca datę jako tekst
	 */
	@Override
	public String toString()
	{
		return Integer.toString(this.ustawionyDzien) + "-"
				+ Integer.toString(this.ustawionyMiesiac) + "-"
				+ Integer.toString(this.ustawionyRok);

	}



	public String jakaJestDzisData()
	{
		return Integer.toString(this.dzisiajDzien) + "-"
				+ Integer.toString(this.dzisiajMiesiac) + "-"
				+ Integer.toString(this.dzisiajRok);
	}



	public static String generujNazwe()
	{
		Calendar kalendarz = Calendar.getInstance();
		String RRRR = Integer.toString(kalendarz.get(Calendar.YEAR));
		String MM = Integer.toString(kalendarz.get(Calendar.MONTH));
		String DD = Integer.toString(kalendarz.get(Calendar.DAY_OF_MONTH));
		String HH = Integer.toString(kalendarz.get(Calendar.HOUR));
		String mm = Integer.toString(kalendarz.get(Calendar.MINUTE));
		String ss = Integer.toString(kalendarz.get(Calendar.SECOND));
		String mili = Integer.toString(kalendarz.get(Calendar.MILLISECOND));
		return RRRR + "_" + MM + "_" + DD + "_" + HH + "_" + mm + "_" + ss
				+ "_" + mili;
	}



	public boolean czyTaSama(Data data)
	{
		return (this.ustawionyRok == data.pobierzUstawionyRok())
				&& (this.ustawionyMiesiac == data.pobierzUstawionyMiesiac())
				&& (this.ustawionyDzien == data.pobierzUstawionyDzien());
	}



	public boolean czyWiekszaOd(Data data)
	{
		if (this.porownaj(data) == Data.WIEKSZA)
		{
			return true;
		}
		else
		{
			return false;
		}
	}



	public boolean czyMniejszaOd(Data data)
	{
		if (this.porownaj(data) == Data.MNIEJSZA)
		{
			return true;
		}
		else
		{
			return false;
		}
	}



	public int porownaj(Data data)
	{
		if (this.czyTaSama(data))
		{
			return Data.ROWNA;
		}
		else
		{
			if (this.ustawionyRok > data.pobierzUstawionyRok())
			{
				return Data.WIEKSZA;
			}
			else if (this.ustawionyMiesiac > data.pobierzUstawionyMiesiac())
			{
				return Data.WIEKSZA;
			}
			else if (this.ustawionyDzien > data.pobierzUstawionyDzien())
			{
				return Data.WIEKSZA;
			}
			else
			{
				return Data.MNIEJSZA;
			}
		}
	}



	public int pobierzDzisiajRok()
	{
		return this.dzisiajRok;
	}



	public int pobierzDzisiajMiesiac()
	{
		return this.dzisiajMiesiac;
	}



	public int pobierzDzisiajDzien()
	{
		return this.dzisiajDzien;
	}



	public int pobierzUstawionyRok()
	{
		return this.ustawionyRok;
	}



	public int pobierzUstawionyMiesiac()
	{
		return this.ustawionyMiesiac;
	}



	public int pobierzUstawionyDzien()
	{
		return this.ustawionyDzien;
	}



	public void ustawUstawionyRok(int ustawionyRok)
	{
		this.ustawionyRok = ustawionyRok;
	}



	public void ustawUstawionyMiesiac(int ustawionyMiesiac)
	{
		this.ustawionyMiesiac = ustawionyMiesiac;
	}



	public void ustawUstawionyDzien(int ustawionyDzien)
	{
		this.ustawionyDzien = ustawionyDzien;
	}



	public Data klonuj()
	{
		return new Data(this.ustawionyDzien, this.ustawionyMiesiac,
				this.ustawionyRok);
	}



	/**
	 * Oblicza wiek i zwraca w postaci tekstu informującego o nim
	 * @return String
	 */
	public String obliczWiek()
	{
		int dni, miesiace, lata;
		lata = this.dzisiajRok - this.ustawionyRok;

		if (this.dzisiajMiesiac < this.ustawionyMiesiac)
		{
			dzisiajMiesiac += 12;
			lata--;
		}
		miesiace = this.dzisiajMiesiac - this.ustawionyMiesiac;
		if (this.dzisiajDzien < this.ustawionyDzien)
		{
			Calendar kalendarz = new GregorianCalendar(this.ustawionyRok,
					this.ustawionyMiesiac, this.ustawionyDzien);
			int ileMialDni = kalendarz.getActualMaximum(Calendar.DAY_OF_MONTH);
			this.dzisiajDzien += ileMialDni;
			miesiace--;
		}
		dni = this.dzisiajDzien - this.ustawionyDzien;

		String ls = (lata <= 0 ? "" : Integer.toString(lata)
				+ (lata == 1 ? " rok"
						: (lata % 2 == 0 ? " lata" : " lat")));
		String ms = (miesiace <= 0 ? "" : Integer.toString(miesiace)
				+ (miesiace % 2 == 0 ? " miesiące" : " miesięcy"));
		String ds = (dni <= 0 ? "" : Integer.toString(dni)
				+ (dni == 1 ? " dzień" : " dni"));

		String opisWieku = ls + (ms == "" ? "" : ", ") + ms + (ms == "" ? "" : ", ") +ds;

		return opisWieku == "" ? "nieznany" : opisWieku;
	}

}
